--- channels/chan_sip.c.orig 2007-04-27 10:04:07.000000000 -0400 +++ channels/chan_sip.c 2007-05-12 06:10:05.000000000 -0400 @@ -776,8 +776,8 @@ #define SIP_PAGE2_T38SUPPORT_RTP (2 << 20) /*!< 21: T38 Fax Passthrough Support (not implemented) */ #define SIP_PAGE2_T38SUPPORT_TCP (4 << 20) /*!< 22: T38 Fax Passthrough Support (not implemented) */ #define SIP_PAGE2_CALL_ONHOLD (3 << 23) /*!< Call states */ -#define SIP_PAGE2_CALL_ONHOLD_ONEDIR (1 << 23) /*!< 23: One directional hold */ -#define SIP_PAGE2_CALL_ONHOLD_INACTIVE (1 << 24) /*!< 24: Inactive */ +#define SIP_PAGE2_CALL_ONHOLD_2DIR (1 << 23) /*!< 23: Two directional hold */ +#define SIP_PAGE2_CALL_ONHOLD_ACTIVE (1 << 24) /*!< 24: Active */ #define SIP_PAGE2_RFC2833_COMPENSATE (1 << 25) /*!< 25: ???? */ #define SIP_PAGE2_BUGGY_MWI (1 << 26) /*!< 26: Buggy CISCO MWI fix */ #define SIP_PAGE2_OUTGOING_CALL (1 << 27) /*!< 27: Is this an outgoing call? */ @@ -5250,7 +5250,7 @@ } /* Manager Hold and Unhold events must be generated, if necessary */ - if (sin.sin_addr.s_addr && (!sendonly || sendonly == -1)) { + if (sin.sin_addr.s_addr && sendonly != -1) { if (ast_test_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD)) { append_history(p, "Unhold", "%s", req->data); if (global_callevents) @@ -5263,7 +5263,7 @@ sip_peer_hold(p, 0); } ast_clear_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD); /* Clear both flags */ - } else if (!sin.sin_addr.s_addr || sendonly ) { + } else if (!sin.sin_addr.s_addr && sendonly != -1 ) { /* No address for RTP, we're on hold */ append_history(p, "Hold", "%s", req->data); @@ -5275,9 +5275,12 @@ p->owner->uniqueid); } if (sendonly == 1) /* One directional hold (sendonly/recvonly) */ - ast_set_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD_ONEDIR); + ast_set_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD ^ SIP_PAGE2_CALL_ONHOLD_2DIR); else if (sendonly == 2) /* Inactive stream */ - ast_set_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD_INACTIVE); + ast_set_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD ^ SIP_PAGE2_CALL_ONHOLD_ACTIVE); + else + ast_set_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD); + if (global_notifyhold) sip_peer_hold(p, 1); } @@ -6249,9 +6252,9 @@ snprintf(connection, sizeof(connection), "c=IN IP4 %s\r\n", ast_inet_ntoa(dest.sin_addr)); ast_build_string(&m_audio_next, &m_audio_left, "m=audio %d RTP/AVP", ntohs(dest.sin_port)); - if (ast_test_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD_ONEDIR)) + if (!ast_test_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD_2DIR)) hold = "a=recvonly\r\n"; - else if (ast_test_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD_INACTIVE)) + else if (!ast_test_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD_ACTIVE)) hold = "a=inactive\r\n"; else hold = "a=sendrecv\r\n";